/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mx.its.dswII.biblioteca.bl;

import java.sql.Time;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import mx.its.dswII.biblioteca.dao.DetallePrestamoDaoLocal;
import mx.its.dswII.biblioteca.dao.PrestamoDaoLocal;
import mx.its.dswII.biblioteca.dao.UsuarioDaoLocal;
import mx.its.dswII.biblioteca.enumeracion.EstadoDetallePrestamo;
import mx.its.dswII.biblioteca.enumeracion.EstadoPrestamo;
import mx.its.dswII.biblioteca.enumeracion.EstadoTransaccion;
import mx.its.dswII.biblioteca.modelo.DetallePrestamo;
import mx.its.dswII.biblioteca.modelo.Libro;
import mx.its.dswII.biblioteca.modelo.Prestamo;
import mx.its.dswII.biblioteca.modelo.Usuario;

/**
 *
 * @author Lenovo-user
 */
@Stateless
public class PrestamoBl implements PrestamoBlLocal {
    @EJB
    private UsuarioDaoLocal usuarioDao;
    @EJB
    private DetallePrestamoDaoLocal detallePrestamoDao;
    @EJB
    private PrestamoDaoLocal prestamoDao;
    

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public EstadoTransaccion register(Prestamo lend, List<Libro> libros) {
        int available = 3;
        Usuario u;
//       u.getPrestamoList()
        List<Prestamo> incompleteLends = prestamoDao.findIncomplet(lend.getIdUsuario());
        for (Prestamo p : incompleteLends) {
            
            available = available - detallePrestamoDao.findLends(p).size();
        }
        if (available <= 0 || libros.size() > available) {
            return EstadoTransaccion.INCOMPLETO;
        } else {
            lend.setFecha(new Date());
            lend.setHora(new Time(new Date().getTime()));
            lend.setEstado((EstadoPrestamo.PENDIENTE.ordinal()));
            prestamoDao.create(lend);
            for (Libro b : libros) {
                DetallePrestamo dp = new DetallePrestamo();
                dp.setIdLibro(b);
                dp.setIdPrestamo(lend);
                dp.setEstado(EstadoDetallePrestamo.PRESTADO.ordinal());
                detallePrestamoDao.create(dp);
            }
        }
        return EstadoTransaccion.COMPLETO;
    }
       public EstadoTransaccion takeBack( List<Libro> books) {
        for(Libro book:books){
            DetallePrestamo dp=detallePrestamoDao.findBooks(book);
            if(dp==null){
                return EstadoTransaccion.INCOMPLETO;
            }else{
                dp.setEstado(EstadoDetallePrestamo.REGRESADO.ordinal());
                detallePrestamoDao.edit(dp);
            }
        }
        return null;
    }
      /*
       * incompleteLendByUser
       * lendBooksByUser
       * generalIncompleteLends
       * generalLendsBooks
       * 
       */

    @Override
    public List<Prestamo> incompleteLendsByUser(Usuario user, Prestamo lend) {
        return prestamoDao.findIncomplet(user);
    }

//    @Override
//    public List<Libro> lendBooksByUser(Usuario user,Libro book) {
//        detallePrestamoDao.findBooks(null)
//        return null;
//    }


    public EstadoTransaccion lendBooks(Usuario idUsuario, List<Libro> listaLibro) {
        List<Prestamo> prestamos =prestamoDao.findIncomplet(idUsuario);
        int available =3;
        for(Prestamo p: prestamos){
            available = available - detallePrestamoDao.findLends(p).size();
        }
        if(available <= 0 || idUsuario.getId()== null || listaLibro.isEmpty() || listaLibro.size()> available ){
            return EstadoTransaccion.INCOMPLETO;        
        }else{
            Prestamo p = new Prestamo();
            p.setIdUsuario(idUsuario);
            p.setFecha(new Date());
            p.setHora(new Date());
            p.setEstado(EstadoPrestamo.TERMINADO.ordinal());
            prestamoDao.create(p);
            
            for(Libro l :listaLibro){
               DetallePrestamo dp = new DetallePrestamo();
               dp.setIdPrestamo(p);
               dp.setIdLibro(l);
               dp.setEstado(EstadoDetallePrestamo.PRESTADO.ordinal());
               detallePrestamoDao.create(dp);
            }
            return EstadoTransaccion.COMPLETO;
        }
    }

   
      public List<Prestamo> getAll() {
        return prestamoDao.findAll();
    }  
       
}
